home *** CD-ROM | disk | FTP | other *** search
/ PC Media 20 / PC MEDIA CD20.iso / share / prog / cursoasm / cap2.msg < prev    next >
Text File  |  1993-06-17  |  11KB  |  161 lines

  1.                 INTRODUCCION AL ASM: EL 8086 Y LA ARQUITECTURA PC
  2.                 =================================================
  3.  
  4.    En este segundo capítulo del curso de ASM, veremos cómo difiere el 8086 de
  5. la arquitectura ideal que vimos en el primer capítulo. Después, comenzaremos
  6. a estudiar los registros del 8086.
  7.  
  8.    El 8086, que es el uP que llevan los compatibles PC (todos los uP de la
  9. serie 80x86 de Intel, los NEC V20 y V30, el Cyrix486, los AMD... son
  10. totalmente compatibles con el 8086, es decir, reconocen el mismo juego de
  11. códigos de operación, aunque incluyan algunos - o muchos - más), difiere
  12. bastante del esquema que vimos en el capítulo anterior.
  13.  
  14.    Lo primero es que los buses de direcciones y de datos tienen otra anchura:
  15. 20 bits para el bus de direcciones y 16 para el de datos. Cuando el uP genera
  16. una lectura de memoria de la dirección x, se leen los bytes de la dirección (x)
  17. y de la dirección (x+1), componiéndose con estos la palabra de 16 bits que se
  18. envía al uP. En el 8086 y todos los uP Intel (y el Z80, y muchos otros), el
  19. byte de la dir. (x) se usa para los 8 bits desde D0 hasta D7, y el de la dir.
  20. (x+1) para los bits desde D8 hasta D15. Este ordenamiento de bytes se suele
  21. denominar 'ordenamiento Intel' (adivinad por qué...), mientras que otros uP
  22. como el Motorola MC68000 y los de su serie (usados en los Mac) usan el
  23. 'ordenamiento Motorola', en el que los bytes de una palabra (con una palabra
  24. nos referimos al conjunto de dos bytes)  se almacenan al reves en memoria.
  25.  
  26.    El 8088 se diferenciaba del 8086 básicamente en que el bus de datos del uP
  27. era de 8 bits, por lo que las lecturas de 16 bits debían realizarse en dos
  28. pasos. A nivel de programación esto no se percibe, ya que una instrucción que
  29. produzca una lectura de 16 bits se ejecuta igual pero tarda el doble, mientras
  30. que la circuitería externa debe ser algo más complicada. Por lo demás, el 8088
  31. lo consideraremos idéntico al 8086 y hablaremos únicamente de éste último. Las
  32. VGA, por ejemplo, son dispositivos que añaden memoria a la propia del ordena-
  33. dor, de manera que decir que una VGA es de 8 bits o de 16 indica si los accesos
  34. a memoria de 16 bits se hacen en dos pasos, como en los ordenadores con 8088, o
  35. en uno. Queda claro por qué el mismo programa corre mucho más rápido en una
  36. VGA de 16 bits que en una de 8, siempre que el programa haga accesos a memoria
  37. de palabra en palabra.
  38.  
  39.    El problema que se presentó a los diseñadores del 8086 fue que los registros
  40. internos del uP (el IP y muchos más que estudiaremos detalladamente más adelan-
  41. te) debían ser de 16 bits, probablemente por limitaciones de diseño, mientras
  42. que las direcciones que se envían por el bus de direcciones (y valga la redun-
  43. dancia) debían ser de 20 bits. Para componer una dirección de memoria completa
  44. son necesarios otros 4 bits además de los 16 de cada registro, ya que si estos
  45. cuatro bits se ponen siempre al mismo valor sólo tendremos acceso a 64K de
  46. memoria. La solución que se adopto ha venido limitando la accesibilidad de
  47. memoria de los PCs desde entonces, y es la razón de que ahora mismo existan
  48. cosas como la memoria extendida, la expandida, y otras peculiaridades que
  49. suponen un gran handicap para los programas que corren en PCs frente a otros
  50. ordenadores como los Mac.
  51.  
  52.    La solución pasaba por añadir en el interior del micro varios registros de
  53. 16 bits llamados 'registros de segmento'. Son cuatro en el 8086 y el 286, y 2
  54. más en el 386 y superiores. Aquí nos limitaremos a usar los del 8086, pero el
  55. uso de los otros es idéntico en los 386+. La dirección completa de 20 bits se
  56. forma a partir de un registro de segmento, que se elige en cada momento, y un
  57. registro de 16 bits que se denomina 'desplazamiento' u 'offset'. Una de las
  58. posibilidades hubiese sido tomar los 4 bits bajos del registro de segmento y
  59. añadirles detrás los 16 del offset. Así compondríamos una dirección completa:
  60.  
  61.                         SEGMENTO     |    OFFSET
  62.                  0000 0000 0000 1010   0101 1111 0000 1010
  63.                                 \      dir. completa     /
  64.                                  1010 0101 1111 0000 1010   (20 bits)
  65.  
  66.    De esta forma, los 4 bits bajos del segmento determinarían uno de los 16
  67. bancos de 64K contenidos en un megabyte de memoria (el espacio direccionable
  68. con 20 bits), y el offset determinaría la dirección en concreto a partir de la
  69. dirección base de este segmento. Si el segmento fuera 0000h accederíamos a los
  70. 64K más bajos del megabyte, si fuera 0001h accederíamos a los 64K siguientes, y
  71. así hasta un valor de segmento de 000Fh con el que accederíamos a los últimos
  72. 64K. Así, haciendo un símil en el que una carta de una baraja represente el
  73. espacio de memoria accesible para cada valor de segmento, nuestra baraja (el
  74. conjunto de todos los segmentos) está formada por 16 cartas, y está dispuesta
  75. con cada carta junto a la otra sin superponerse, de manera que con todas las
  76. cartas podemos acceder al mega completo de memoria. Con esta disposición a cada
  77. posición de memoria sólo puede acceder por medio de una carta, y por tanto el
  78. par segmento:offset que determina una dirección de memoria concreta es único.
  79.  
  80.    Pero ya que los registros de segmento se hicieron de 16 bits, se eligió otra
  81. forma de hacerlo de manera que se aprovechan totalmente los 16 bits del
  82. segmento: lo que se hace para generar la dirección completa es desplazar el
  83. segmento cuatro bits hacia la izquierda, rellenando los 4 bits de la derecha
  84. con ceros, y sumarle al valor de 20 bits resultante el offset. El desplaza-
  85. miento a la izquierda equivale a multiplicar por 16 o añadir un cero a la
  86. derecha en hexadecimal:
  87.  
  88.                                    /  valor de seg.  \
  89.                16d x  SEGMENTO     0000 0000 0000 1010 0000 <- 4 bits 'extra'
  90.                       OFFSET            0101 1111 0000 1010
  91.                      ---------------------------------------
  92.                    DIRECCION REAL  0000 0101 1111 1010 1010  (20 bits)
  93.  
  94.    Así, el valor de segmento determina una dirección base (la formada por su
  95. valor con los cuatro bits a cero), a partir de la cual el offset especifica
  96. cuánto hay que moverse para hallar la dirección en concreto. Si meditamos un
  97. poco sobre esto, podemos apreciar que cada segmento de 64K (que es el espacio
  98. direccionable variando el offset y dejando el segmento fijo) se superpone con
  99. otros segmentos. Ahora, volviendo al símil de la baraja, tenemos 64K (64*1024)
  100. cartas, correspondientes a los 64K posibles diferentes valores de segmento.
  101. También ahora podemos acceder al mega completo, pero las cartas están dispues-
  102. tas no una al lado de la otra, sino que cada carta está dispuesta 16 posiciones
  103. más a la derecha (o más arriba) que la anterior, de manera que se superpone a
  104. la anterior casi en toda su extensión. Pero, como ya hemos dicho, la anchura
  105. total de las cartas (la memoria total accesible) sigue siendo de un megabyte.
  106. Así, una misma dirección real se puede generar a partir de diferentes valores
  107. de segmento y offset. Por ejemplo, veamos la posición de memoria absoluta 17d
  108. o 00011h. Esta dirección se puede especificar como valor de segmento 0 y offset
  109. 17d (0000:0011h), pero podemos apreciar que el par 0001:0001 también representa
  110. la misma dirección absoluta. Para especificar una dirección por medio del seg-
  111. mento y el offset se suele poner el valor del segmento (sin los cuatro bits que
  112. se añaden a la derecha), dos puntos, y el valor de offset. Como segundo ejem-
  113. plo, las direcciones 0040h:0000 y 0000:0400h son totalmente equivalentes y
  114. ambas referencian la misma dirección absoluta de memoria, la 00400h o 1024d.
  115.  
  116.    Para ir entrando un poco en cómo es el 8086 en concreto, recordaremos un
  117. registro que ya mencionamos: el IP o 'Instruction Pointer', que contiene la
  118. dirección de la siguiente instrucción a ejecutar. Este registro es de 16 bits,
  119. por lo que necesitamos un registro de segmento para componer la dirección
  120. completa de la siguiente instrucción. El segmento 'CS' o 'Code Segment' es el
  121. registro con el que el uP compone la dirección completa de la siguiente
  122. instrucción a recoger y ejecutar.
  123.  
  124.    En un libro de programación en ASM tradicional, ahora veríamos el conjunto
  125. completo de registros del 8086, la función de cada uno, etc... Estos libros,
  126. además de para el aprendizaje, están pensados como referencia para el progra-
  127. mador que ya conoce el micro o que ya conoce ASM de algún otro micro. Pero ya
  128. que esto es un curso pensado para gente que nunca antes haya tenido contacto
  129. con el lenguaje ensamblador, se seguirá otro orden: veremos primero algunos de
  130. los registros, cuya función se puede comprender con los conocimientos adquiri-
  131. dos hasta ahora, y a medida que se vayan introduciendo conceptos como la pila,
  132. los saltos condicionales, etc... veremos el resto de los registros.
  133.  
  134.    Todos los micros, incluyendo el menos potente, suelen tener un registro que
  135. se utiliza de forma preferente para las operaciones aritméticas y lógicas.
  136. Algunos micros, como el Z80, tienen algunas instrucciones que sólo pueden
  137. ejecutarse con este registro. Este registro se suele denominar 'acumulador',
  138. y en el 8086 toma el nombre simbólico de 'AX'. El 8086, además del AX,
  139. incorpora otros tres registros denominados 'de propósito general', con los que
  140. también se pueden hacer algunas operaciones aritméticas. Pero, por ejemplo, las
  141. multiplicaciones o divisiones sólo se pueden hacer con el AX. Los otros
  142. registros también presentan peculiaridades, instrucciones que operan sobre un
  143. registro determinado, pero las iremos viendo sobre la marcha. Estos otros tres
  144. registros se representan mediante los nombres 'BX', 'CX' y 'DX', y son todos
  145. de 16 bits.
  146.  
  147.    Para componer direcciones de memoria, además del CS que se usa principal-
  148. mente para complementar al IP, existen otros registros de segmento. Por el
  149. momento describiremos dos de los otros tres que existen, el 'DS' (Data
  150. Segment) y el 'ES' (Extra Segment). Cuando leemos datos de la memoria, dando
  151. la dirección de la que leer por medio de un registro, por defecto se construye
  152. la dirección completa usando el DS, aunque se puede especificar en la instruc-
  153. ción si se quiere usar el ES o el CS en su lugar.
  154.  
  155.    En el siguiente capítulo veremos la primera instrucción de ASM, la más
  156. usada, la instrucción 'MOV'. Y comentaremos algunas cosillas de cómo empezar
  157. a experimentar con el ASM sin más que el DEBUG del MS-DOS.
  158.  
  159.    Salut!!! :-)
  160.  
  161.    Jon